#include <gdk/gdk.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
+#include <X11/Xlib.h>
#endif
#include <stdlib.h>
{
ShewExternalWindow parent;
- GdkWindow *foreign_gdk_window;
+ int foreign_xid;
};
G_DEFINE_TYPE (ShewExternalWindowX11, shew_external_window_x11,
return x11_display;
}
+static gboolean
+check_foreign_xid (GdkDisplay *display,
+ int xid)
+{
+ gboolean result = FALSE;
+#ifdef GDK_WINDOWING_X11
+ XWindowAttributes attrs;
+
+ gdk_x11_display_error_trap_push (display);
+ result = XGetWindowAttributes (GDK_DISPLAY_XDISPLAY (display), xid, &attrs);
+ if (gdk_x11_display_error_trap_pop (display))
+ return FALSE;
+
+#endif
+ return result;
+}
+
ShewExternalWindowX11 *
shew_external_window_x11_new (const char *handle_str)
{
ShewExternalWindowX11 *external_window_x11;
GdkDisplay *display;
int xid;
- GdkWindow *foreign_gdk_window = NULL;
display = get_x11_display ();
if (!display)
return NULL;
}
-#ifdef GDK_WINDOWING_X11
- foreign_gdk_window = gdk_x11_window_foreign_new_for_display (display, xid);
-#endif
-
- if (!foreign_gdk_window)
+ if (!check_foreign_xid (display, xid))
{
- g_warning ("Failed to create foreign window for XID %d", xid);
+ g_warning ("Failed to find foreign window for XID %d", xid);
return NULL;
}
external_window_x11 = g_object_new (SHEW_TYPE_EXTERNAL_WINDOW_X11,
"display", display,
NULL);
- external_window_x11->foreign_gdk_window = foreign_gdk_window;
+ external_window_x11->foreign_xid = xid;
return external_window_x11;
}
ShewExternalWindowX11 *external_window_x11 =
SHEW_EXTERNAL_WINDOW_X11 (external_window);
- gdk_window_set_transient_for (child_window,
- external_window_x11->foreign_gdk_window);
-}
-
-static void
-shew_external_window_x11_dispose (GObject *object)
-{
- ShewExternalWindowX11 *external_window_x11 = SHEW_EXTERNAL_WINDOW_X11 (object);
-
- g_clear_object (&external_window_x11->foreign_gdk_window);
-
- G_OBJECT_CLASS (shew_external_window_x11_parent_class)->dispose (object);
+#ifdef GDK_WINDOWING_X11
+ XSetTransientForHint (GDK_WINDOW_XDISPLAY (child_window),
+ GDK_WINDOW_XID (child_window),
+ external_window_x11->foreign_xid);
+#endif
}
static void
static void
shew_external_window_x11_class_init (ShewExternalWindowX11Class *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
ShewExternalWindowClass *external_window_class = SHEW_EXTERNAL_WINDOW_CLASS (klass);
- object_class->dispose = shew_external_window_x11_dispose;
-
external_window_class->set_parent_of = shew_external_window_x11_set_parent_of;
}